﻿/******************************************************************************
 * Project 3 uses interfaces to extend the payroll system developed           *
 * in Project 2.                                                              *
 *                                                                            *
 * Suppose that the company involved wants to perform several accounting      *
 * operations in a single accounts-payable application—in addition to         *
 * calculating the payroll earnings that must be paid to each employee, the   *
 * company must also calculate the payment due on each of several invoices.   *
 * Though applied to unrelated things, both operations have to do with        *
 * calculating some kind of payment amount. For an employee, the payment      *
 * refers to the employee’s earnings. For an invoice, the payment refers to   *
 * the total cost of the goods listed on the invoice. Can we calculate such   *
 * different things as the payments due for employees and invoices            *
 * polymorphically in a single application? Does C# offer a capability that   *
 * requires that unrelated classes implement a set of common methods? C#      *
 * interfaces offer exactly this capability.                                  *
 *                                                                            *
 * Interfaces define and standardize the ways in which people and systems can *
 * interact with each other. For example, the controls on a radio serve as an *
 * interface between a user and the radio’s internal components. The controls *
 * allow users to perform a limited set of operations (e.g., changing the     *
 * station, adjusting the volume, choosing between AM and FM), and different  *
 * radios may implement the controls in different ways (e.g., using push      *
 * buttons, dials, voice commands). The interface specifies what operations a *
 * radio must permit users to perform but does specify how the operations are *
 * performed. Similarly, the interface between a driver and a car with a      *
 * manual transmission includes the steering wheel, the gear shift, the       *
 * clutch pedal, the gas pedal and the brake pedal. This same interface is    *
 * found in nearly all manual-transmission cars, enabling someone who knows   *
 * how to drive one particular manual-transmission car to drive just about    *
 * any manual-transmission car. The components may look a bit different, but  *
 * the general purpose is the same—to allow people to drive the car.          *
 *                                                                            *
 * Software objects also communicate via interfaces. A C# interface describes *
 * a set of methods that can be called on an object, to tell the object to    *
 * perform some task or return some piece of information, for example. The    *
 * next part of Project Two introduces an interface named IPayable that       *
 * describes the functionality of any object that must be capable of being    *
 * paid and thus must offer a method to determine the proper amount due. an   *
 * interface declaration begins with the keyword interface and can contain    *
 * only abstract methods, properties, indexers, and events. All interface     *
 * members are implicitly declared both public and abstract. In addition,     *
 * each interface can extend one or more other interfaces to create a more    *
 * elaborate interface that other classes can implement.                      *
 *                                                                            *
 * To use an interface, a class must specify that it implements the           *
 * interface by listing the interface after the colon ( : ) in the class      *
 * declaration. Note that this is the same syntax used to indicate            *
 * inheritance from a base class. A class implementing the interface must     *
 * declare each member of the interface with the signature specified in the   *
 * interface declaration. A class the implements an interface but does not    *
 * implement all the interface’s members is an abstract class—it must be      *
 * declared abstract and must contain an abstract declaration for each        *
 * unimplemented member of the interface. Implementing an interface is like   *
 * signing a contract with the compiler that states, “I will provide an       *
 * implementation for all the members specified by the interface, or I will   *
 * declare them abstract.”                                                    *
 *                                                                            *
 * An interface is typically used when unrelated classes need to share common *
 * methods. This allows objects of unrelated classes to be processed          *
 * polymorphically—objects of classes that implement the same interface can   *
 * respond to the same method calls. Programmers can create an interface that *
 * describes the desired functionality, then implement this interface in any  *
 * classes requiring that functionality. For example, in the accounts-payable *
 * application for this project, we implement interface IPayable in any class *
 * that must be able to calculate a payment amount.                           *
 *                                                                            *
 * An interface often is used in place of an abstract class when there is no  *
 * default implementation to inherit—that is, no fields and no default method *
 * implementations. Like public abstract classes, interfaces are typically    *
 * public types, so they are normally declared in files by themselves with    *
 * the same name as the interface and the .cs filename extension.             *
 *                                                                            *
 * To build an application that can determine payments for employees and      *
 * invoices, you will create an interface named IPayable. Interface IPayable  *
 * contains method GetPaymentAmount that returns a decimal amount that must   *
 * be paid for an object of any class that implements the interface. Method   *
 * GetPaymentAmount is a general purpose version of method Earnings of the    *
 * Employee hierarchy—method Earnings calculates a payment amount specifically* 
 * for an Employee, while GetPaymentAmount can be applied to a broad range of * 
 * unrelated objects. After declaring interface IPayable, you will create     *
 * class Invoice, which implements interface IPayable. Finally, you will      *
 * update Employee derived classs SalariedEmployee to ‘fit’ into the IPayable *
 * hierarchy.                                                                 *
 ******************************************************************************/